package com.pet.system.utils;

import lombok.experimental.UtilityClass;
import lombok.extern.slf4j.Slf4j;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import java.util.UUID;

/**
 * 应用工具类
 *
 * @author Centaurea
 */
@Slf4j
@UtilityClass
public class AppUtil {
  private static final String[] CHARS =
      new String[] {
        "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r",
        "s", "t", "u", "v", "w", "x", "y", "z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
        "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R",
        "S", "T", "U", "V", "W", "X", "Y", "Z"
      };

  /**
   * 短8位UUID思想其实借鉴微博短域名的生成方式，但是其重复概率过高，而且每次生成4个，需要随即选取一个。 <br>
   * 本算法利用62个可打印字符，通过随机生成32位UUID，由于UUID都为十六进制，所以将UUID分成8组，每4个为 <br>
   * 一组，然后通过模62操作，结果作为索引取出字符， 这样重复率大大降低。
   *
   * @return AppKey
   */
  public static String getAppKey() {
    StringBuilder shortBuffer = new StringBuilder();
    String uuid = UUID.randomUUID().toString().replace("-", "");
    for (int i = 0; i < 8; i++) {
      String str = uuid.substring(i * 4, i * 4 + 4);
      int x = Integer.parseInt(str, 16);
      shortBuffer.append(CHARS[x % 0x3E]);
    }
    return shortBuffer.toString();
  }

  /**
   * 通过 appId 和 appKey 生成 APP Secret
   *
   * @param appId (唯一的值)
   * @param appKey appKey
   * @return APP Secret
   */
  public static String getAppSecret(String appId, String appKey) {
    try {
      String[] array = new String[] {appKey, appId};
      StringBuilder sb = new StringBuilder();
      // 字符串排序
      Arrays.sort(array);
      for (String s : array) {
        sb.append(s);
      }
      String str = sb.toString();
      MessageDigest md = MessageDigest.getInstance("SHA-1");
      md.update(str.getBytes());
      byte[] digest = md.digest();
      StringBuilder hexStr = new StringBuilder();
      String shaHex = "";
      for (byte b : digest) {
        shaHex = Integer.toHexString(b & 0xFF);
        if (shaHex.length() < 2) {
          hexStr.append(0);
        }
        hexStr.append(shaHex);
      }
      return hexStr.toString();
    } catch (NoSuchAlgorithmException e) {
      e.printStackTrace();
      throw new RuntimeException();
    }
  }
}
